home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-087 < prev    next >
Text File  |  1995-12-31  |  88KB  |  2,141 lines

  1. C.S.M.P. Digest             Tue, 07 Mar 95       Volume 3 : Issue 87
  2.  
  3. Today's Topics:
  4.  
  5.         Aliases
  6.         How to write to same directory as App??
  7.         INITGestalt Proposal
  8.         Information on installer maker companies
  9.         Sound Manager clicking with sampled sounds
  10.         VBL, time manager interrupts on PPC
  11.         anything *bad* about mixing alignment types in CW?
  12.         custom ClikLoop problem
  13.  
  14.  
  15.  
  16. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  17. (pottier@clipper.ens.fr).
  18.  
  19. The digest is a collection of article threads from the internet newsgroup
  20. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  21. regularly and want an archive of the discussions.  If you don't know what a
  22. newsgroup is, you probably don't have access to it.  Ask your systems
  23. administrator(s) for details.  If you don't have access to news, you may
  24. still be able to post messages to the group by using a mail server like
  25. anon.penet.fi (mail help@anon.penet.fi for more information).
  26.  
  27. Each issue of the digest contains one or more sets of articles (called
  28. threads), with each set corresponding to a 'discussion' of a particular
  29. subject.  The articles are not edited; all articles included in this digest
  30. are in their original posted form (as received by our news server at
  31. nef.ens.fr).  Article threads are not added to the digest until the last
  32. article added to the thread is at least two weeks old (this is to ensure that
  33. the thread is dead before adding it to the digest).  Article threads that
  34. consist of only one message are generally not included in the digest.
  35.  
  36. The digest is officially distributed by two means, by email and ftp.
  37.  
  38. If you want to receive the digest by mail, send email to listserv@ens.fr
  39. with no subject and one of the following commands as body:
  40.     help                                Sends you a summary of commands
  41.     subscribe csmp-digest Your Name     Adds you to the mailing list
  42.     signoff csmp-digest                 Removes you from the list
  43. Once you have subscribed, you will automatically receive each new
  44. issue as it is created.
  45.  
  46. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  47. Questions related to the ftp site should be directed to
  48. scott.silver@dartmouth.edu.
  49.  
  50. -------------------------------------------------------
  51.  
  52. >From slp@alumni.caltech.edu (Steve Patt)
  53. Subject: Aliases
  54. Date: 17 Feb 1995 18:17:59 GMT
  55. Organization: California Institute of Technology, Pasadena
  56.  
  57. Situation: If a file is modified, my program renames the original as
  58.   "XXX Backup", then saves the new file as "XXX".
  59.  
  60. Problem: This seems to run into a problem with aliases. For example,
  61.   Launcher in Sys 7.5, or the "Recent Documents" Apple menu item (again in 7.5),
  62.   both use aliases to point to a file. After I do the rename and save a new
  63.   file as described, it seems that the alias still points to the original
  64.   file. So someone uses "Recent Documents" to open the document, but actually
  65.   what opens is the _backup_, not the new file. THIS IS BAD.
  66.  
  67. Workaround: Clearly I could work around this by _copying_ the original file to
  68.   "XXX Backup", and then just overwriting the file with the new file. But this
  69.   will take twice as long to write to disk (since I'll basically be writing the
  70.   file twice).
  71.  
  72. Question: Is there a way to deal with this?
  73.  
  74. Steve Patt
  75. Stevens Creek Software
  76. slp@alumni.caltech.edu
  77.  
  78. +++++++++++++++++++++++++++
  79.  
  80. >From dshaw@intac.com (David Shaw)
  81. Date: 18 Feb 1995 15:28:46 GMT
  82. Organization: INTAC Access Corp
  83.  
  84. In comp.sys.mac.programmer.help, slp@alumni.caltech.edu (Steve Patt) writes:
  85. >Situation: If a file is modified, my program renames the original as
  86. >  "XXX Backup", then saves the new file as "XXX".
  87. >
  88. >Problem: This seems to run into a problem with aliases. For example,
  89. >  Launcher in Sys 7.5, or the "Recent Documents" Apple menu item (again in 7.5)
  90. >,
  91. >  both use aliases to point to a file. After I do the rename and save a new
  92. >  file as described, it seems that the alias still points to the original
  93. >  file. So someone uses "Recent Documents" to open the document, but actually
  94. >  what opens is the _backup_, not the new file. THIS IS BAD.
  95.  
  96. You might try looking into the FSpExchangeFiles call.  Save your 
  97. "changed" file as "XXX Backup" and then swap it with "XXX".  I believe 
  98. (but I am not 100% sure) that FSpExchangeFiles correctly handles aliases.
  99.  
  100. David
  101.  
  102. +++++++++++++++++++++++++++
  103.  
  104. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  105. Date: Mon, 20 Feb 1995 12:24:32 GMT
  106. Organization: Rijksuniversiteit Utrecht
  107.  
  108. In article <slp-1702951021160001@bigmac.al.nmr.varian.com>,
  109. slp@alumni.caltech.edu (Steve Patt) wrote:
  110.  
  111. > Situation: If a file is modified, my program renames the original as
  112. >   "XXX Backup", then saves the new file as "XXX".
  113. > Problem: This seems to run into a problem with aliases. For example,
  114. >   Launcher in Sys 7.5, or the "Recent Documents" Apple menu item (again
  115. in 7.5),
  116. >   both use aliases to point to a file. After I do the rename and save a new
  117. >   file as described, it seems that the alias still points to the original
  118. >   file. So someone uses "Recent Documents" to open the document, but actually
  119. >   what opens is the _backup_, not the new file. THIS IS BAD.
  120. > Workaround: Clearly I could work around this by _copying_ the original file to
  121. >   "XXX Backup", and then just overwriting the file with the new file. But this
  122. >   will take twice as long to write to disk (since I'll basically be
  123. writing the
  124. >   file twice).
  125. > Question: Is there a way to deal with this?
  126. > Steve Patt
  127. > Stevens Creek Software
  128. > slp@alumni.caltech.edu
  129.  
  130. Yes, just write the new file to the ' backup' file and then use FSpExchangeFiles
  131. (not sure about the exact name). It is made for it. See IM VI for details.
  132.  
  133. Reinder Verlinde
  134.  
  135. +++++++++++++++++++++++++++
  136.  
  137. >From fixer@faxcsl.dcrt.nih.gov (Chris Tate)
  138. Date: Tue, 21 Feb 1995 15:15:08 GMT
  139. Organization: DCRT, NIH, Bethesda, MD
  140.  
  141. In article <slp-1702951021160001@bigmac.al.nmr.varian.com>, slp@alumni.caltech.edu (Steve Patt) writes:
  142. >
  143. >Workaround: Clearly I could work around this by _copying_ the original file to
  144. >  "XXX Backup", and then just overwriting the file with the new file. But this
  145. >  will take twice as long to write to disk (since I'll basically be writing the
  146. >  file twice).
  147.  
  148. Just an idea (since I don't have my Inside Macs available at the moment),
  149. but isn't this exactly the sort of thing that FSpExchangeFiles() was
  150. designed to address?
  151.  
  152. Write the *new* file as "XXX Backup," then call FSpExchangeFiles() to
  153. swap its directory entries with the outdated file.  I *think* this will
  154. accomplish the necessary alias-rerouting. At least, it's worth a little
  155. test....  :-)
  156.  
  157. (I can't do the test, unfortunately.  I'm chained to a Windows machine for
  158. a few months, and don't get to work on the Mac for a while.  Fooey. :-(
  159.  
  160. - ----------------------------------------------------------
  161. Christopher Tate           | "I love it when you use me as
  162. fixer@faxcsl.dcrt.nih.gov  |  a split-screen montage!"
  163. eWorld:  cTate             |   -- "Whose Line Is It Anyway?"
  164.  
  165. ---------------------------
  166.  
  167. >From cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine)
  168. Subject: How to write to same directory as App??
  169. Date: Tue, 14 Feb 1995 11:19:34 -0700
  170. Organization: Ministry of Environment, Lands & Parks
  171.  
  172. I'm looking at a program I'm writting and one thing I would like to do is
  173. read and write specific files for my program in the SAME FOLDER as my
  174. program.
  175.  
  176. FSpCreate takes an FSSpec record and stuff.  How do I know what directory
  177. and volume my program is in/on?  I want to read and write a specific
  178. filename to this directory.  Do I find out where my program is and then
  179. read/write the file? if how do I do that?
  180.  
  181. Some programs (Mosaic for example) have a dialog that shows the full path
  182. to a particular folder.  How do I create something similar and maybe use
  183. the full pathname to read/write the file(s) I need?
  184.  
  185. Thanks for any help you can give!
  186.  
  187. Any code is usefull.  Post also to alt.sources.mac as others would be
  188. interested in this.
  189.  
  190. -- 
  191. ========================================================================
  192. Carl B. Constantine                  B.C. Environment, Lands & Parks
  193. Systems Officer                      CCONSTAN@epdiv1.env.gov.bc.ca
  194. "Remember, no matter where you go - there you are" - Buckaroo Bonzai
  195.  
  196. +++++++++++++++++++++++++++
  197.  
  198. >From sardaukar@aol.com (Sardaukar)
  199. Date: 14 Feb 1995 21:28:03 -0500
  200. Organization: America Online, Inc. (1-800-827-6364)
  201.  
  202. Here's how Apple answered the same question when I asked it years ago:
  203.  
  204. >Is there a cool, modern way to get the FSSpec record of the running
  205. application?  I was going to use GetApParms to find the name, and GetVol
  206. to get the vRef, and i'd somehow figure out the dirID (btw, how *do* you
  207. figure out the dirID??), and do a MakeFSSpec, but I imagine that there
  208. must be a better way that doesn't rely on old functions and system
  209. globals.
  210.  
  211. For the first question, here are three methods that you could use.  The
  212. first
  213. uses the Process Manager to get the application's location.  If you have
  214. the
  215. Process Manager available, you should use it:
  216.  
  217.    FUNCTION GetAppLocFromPM (VAR spec: FSSpec): OSErr;
  218.       VAR
  219.          PSN: ProcessSerialNumber;
  220.          info: ProcessInfoRec;
  221.    BEGIN
  222.       info.processInfoLength := sizeof(ProcessInfoRec);
  223.       info.processName := NIL;
  224.       info.processAppSpec := @spec;
  225.       PSN.highLongOfPSN := 0;
  226.       PSN.lowLongOfPSN := kCurrentProcess;
  227.       GetAppLocFromPM := GetProcessInformation(PSN, info);
  228.    END;
  229.  
  230. The second gets the application's location by getting the information from
  231. the
  232. application's resource fork refNum (returned by CurResFile).  Just make
  233. sure
  234. you don't change the current resource file before using this function:
  235.  
  236.    FUNCTION GetAppLocFromCurResFile (VAR spec: FSSpec): OSErr;
  237.       VAR
  238.          err: OSErr;
  239.          fcbPB: FCBPBRec;
  240.          fileName: Str255;
  241.    BEGIN
  242.       WITH fcbPB DO
  243.          BEGIN
  244.             ioNamePtr := @fileName;
  245.             ioVRefNum := 0;
  246.             ioRefNum := CurResFile;
  247.             ioFCBIndx := 0;
  248.          END;
  249.       err := PBGetFCBInfoSync(@fcbPB);
  250.       IF err = noErr THEN
  251.          err := FSMakeFSSpec(fcbPB.ioFCBVRefNum, fcbPB.ioFCBParID,
  252. fileName,
  253. spec);
  254.       GetAppLocFromCurResFile := err; { return any errors }
  255.    END;
  256.  
  257. The third method gets the application's location by getting the
  258. information
  259. from the application's resource fork refNum (returned by GetAppParms):
  260.  
  261.    FUNCTION GetAppLocFromGetAppParms (VAR spec: FSSpec): OSErr;
  262.       VAR
  263.          err: OSErr;
  264.          fcbPB: FCBPBRec;
  265.          fileName: Str255;
  266.          apParam: Handle;
  267.    BEGIN
  268.       GetAppParms(fileName, fcbPB.ioRefNum, apParam);
  269.       WITH fcbPB DO
  270.          BEGIN
  271.             ioNamePtr := @fileName;
  272.             ioVRefNum := 0;
  273.             ioFCBIndx := 0;
  274.          END;
  275.       err := PBGetFCBInfoSync(@fcbPB);
  276.       IF err = noErr THEN
  277.          err := FSMakeFSSpec(fcbPB.ioFCBVRefNum, fcbPB.ioFCBParID,
  278. fileName,
  279. spec);
  280.       GetAppLocFromGetAppParms := err; { return any errors }
  281.    END;
  282.  
  283. Note that the second and third methods given don't return the same
  284. location as
  285. the Process Manager if you're running you code under the THINK development
  286. environment, but they all work the same in stand-alone applications. Under
  287. THINK Pascal or C, the location returned by GetAppParms and CurResFile are
  288. the
  289. location of the project file - the Process Manager returns the location of
  290. THINK Pascal or C.
  291.  
  292.  
  293. +++++++++++++++++++++++++++
  294.  
  295. >From Jaeger@fquest.com (Brian Stern)
  296. Date: 15 Feb 1995 04:14:52 GMT
  297. Organization: The University of Texas at Austin, Austin, Texas
  298.  
  299. In article <cconstan-1402951119340001@epdso1.env.gov.bc.ca>,
  300. cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine) wrote:
  301.  
  302. < FSpCreate takes an FSSpec record and stuff.  How do I know what directory
  303. < and volume my program is in/on?  I want to read and write a specific
  304.  
  305. < ========================================================================
  306. < Carl B. Constantine                  B.C. Environment, Lands & Parks
  307. < Systems Officer                      CCONSTAN@epdiv1.env.gov.bc.ca
  308. < "Remember, no matter where you go - there you are" - Buckaroo Bonzai
  309.  
  310. Use the process manager calls GetCurrentProcess() and GetProcessInfo(). 
  311. The process info rec has the fsspec of the app in it, along with other fun
  312. info.
  313.  
  314. Good luck,
  315.  
  316. -- 
  317. Brian  Stern  :-{)}
  318. Toolbox commando and Menu bard
  319. Jaeger@fquest.com
  320.  
  321. +++++++++++++++++++++++++++
  322.  
  323. >From S.W.Lay@damtp.cam.ac.uk (Steve Lay)
  324. Date: Wed, 15 Feb 1995 09:27:08 +0000
  325. Organization: DAMTP, Cambridge University
  326.  
  327. This came up a few days ago too in another guise.  Here's how to get an
  328. FSSpec for your application using the Process Mgr (where available):
  329.  
  330.     {
  331.     ProcessSerialNumber psn;
  332.     ProcessInfoRec pInfo;
  333.     FSSpec file;
  334.     OSErr err;
  335.  
  336.     psn.highLongOfPSN=0;
  337.     psn.lowLongOfPSN=kCurrentProcess;
  338.     pInfo.processInfoLength=sizeof(ProcessInfoRec);
  339.     pInfo.processName=nil;
  340.     pInfo.processAppSpec=&file;
  341.     err=GetProcessInformation(&psn,&pInfo);
  342.     }
  343.  
  344. Steve
  345.  
  346. -- 
  347. Steve Lay
  348. Interactive Courseware Research & Development
  349.  
  350. S.W.Lay@damtp.cam.ac.uk
  351.  
  352. +++++++++++++++++++++++++++
  353.  
  354. >From jwbaxter@olympus.net (John W. Baxter)
  355. Date: Wed, 15 Feb 1995 07:56:34 -0800
  356. Organization: Internet for the Olympic Peninsula
  357.  
  358. In article <cconstan-1402951119340001@epdso1.env.gov.bc.ca>,
  359. cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine) wrote:
  360.  
  361. > I'm looking at a program I'm writting and one thing I would like to do is
  362. > read and write specific files for my program in the SAME FOLDER as my
  363. > program.
  364.  
  365. Others have given answers.  [Also look around in the routines in the
  366. MoreFiles collection.]
  367.  
  368. But...no problem if you are writing for yourself.  If writing for
  369. distribution, you need to do something about the case where the user
  370. doesn't have write access to the folder containing your application (it's
  371. on a server from a folder without write permission for some user; it's
  372. running from CD...[easier to forbid the latter than the former]).
  373.  
  374. So you need some sort of fallback.  That's where the Preferences folder
  375. came from:  the user by definition does have write access to the System
  376. folder (or some other location of the Preferences, now that booting from
  377. CD is possible).
  378.  
  379.    --John
  380.  
  381. -- 
  382. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  383.        Isn't C fun?
  384.    jwbaxter@pt.olympus.net
  385.  
  386. ---------------------------
  387.  
  388. >From rgaros@bio.vu.nl (Rene G.A. Ros)
  389. Subject: INITGestalt Proposal
  390. Date: Wed, 1 Feb 1995 10:55:36 GMT
  391. Organization: VU Biology, Amsterdam, The Netherlands
  392.  
  393.  
  394.  
  395.                                      Pembury UK/Amsterdam NL, 31 Januari 1995
  396.  
  397. Dear Fellow programmers,
  398.  
  399. Some time ago we found a need for a way to obtain information about
  400. installed software in a standardized way. The Gestalt Manager provides an
  401. excellent mechanism for this and we decided the best thing to do was to
  402. design a record structure to which a pointer was obtained by using a normal
  403. Gestalt call. This record structure was designed to provide the basic
  404. features needed but allows for addition of future attribute bits and
  405. fields.
  406. Indeed, during the design of this structure it was found useful to include
  407. a pointer to a control function as well. Using this control function
  408. software can receive messages to change settings or to obtain more
  409. information.
  410. We have called this mechanism 'INITGestalt' but it is also usable by
  411. software other than extensions.
  412. Included below is the latest version of our proposal (1.0b1) which we like
  413. to discuss with you. Also available are a C and Pascal header file. The
  414. full package (proposal and header files) can be obtained by sending an
  415. email to
  416.     gestalt-selectors-list-request@bio.vu.nl
  417. with as subject
  418.     archive get INITGestalt*
  419.  
  420.  
  421. Please post replies instead of using email.
  422.  
  423.  
  424. Best Regards,
  425.  
  426. Jeremy Roussak (jeremyr@dcs.qmw.ac.uk)
  427.  
  428. Rene G.A. Ros (rgaros@bio.vu.nl)
  429.  
  430.  
  431.      with contributions from:
  432.           Dave Ely (ely@netcom.com)
  433.           Bill Hofmann (wdh@fresh.com)
  434.           John Mancino (mancino@decismkr.com)
  435.           Jens Miltner (jmiltner@theorie3.physik.uni-erlangen.de)
  436.           Alessandro Levi Montalcini (LMontalcini@pmn.it)
  437.           Fabrizio Oddone (gspnx@di.unito.it)
  438.           Quinn "The Eskimo" (quinn@cs.uwa.edu.au)
  439.           Hans Verbrugge (hverbrug@inter.nl.net)
  440.  
  441.  
  442.  
  443. INITGestalt: a proposal
  444. =======================
  445.  
  446. Version 1.0b1
  447. Last modified: 31 January 1995
  448.  
  449. It is often useful for an extension, or indeed an application, to know
  450. whether certain other extensions are running (the term "extensions"
  451. primarily includes system extensions, control panels and background-only
  452. applications, although there is no reason why it should not include
  453. ordinary applications). The reasons could be to take evasive action to
  454. avoid conflicts with other extensions, to co-operate with another
  455. extension, perhaps by using that extension's features, or possibly to
  456. disable similar features. Equally, it could be useful for one extension
  457. temporarily to turn off another: witness the "toggle Super Boomerang" FKEY
  458. and the QuicKeys extension for Scroll2.
  459.  
  460. Fortunately, since system 6.0.4 a system-supported mechanism has existed
  461. whereby this could be achieved: Gestalt.
  462.  
  463. We would therefore like to propose a standard to which writers of software
  464. could adhere. The success of ShowINIT indicates that such a de facto
  465. standard can emerge.
  466.  
  467. 1. Every extension should register a Gestalt selector equal to its
  468. signature. If Gestalt subsequently returns gestaltUndefSelectorErr, the
  469. extension is not loaded.
  470.  
  471. 2. The value returned by Gestalt is of suffix type Table: that is, a
  472. pointer to more data. The block to which the pointer points is already
  473. allocated and should not be disposed, since it might be part of a larger
  474. memory block. The returned value may be nil if the installed software is
  475. disabled and removed from memory, or when the application has quit. The
  476. Gestalt definition function which returns the value should not move memory
  477. and should be safe to be called at interrupt time.
  478.  
  479. 3. The minimum table returned should contain the record described below.
  480. The table returned is read-only.
  481.  
  482. C:
  483. typedef struct
  484. {
  485.         OSType          recType;                        // must always be kGestaltRecordType
  486.         NumVersion      recVersion;                     // the version of the record format
  487.         NumVersion      version;                        // version of installed software
  488.         ulong           stdAttr;                        // attribute bits defined by standard
  489.         ulong           reserved1;                      // reserved, for more attribute bits
  490.         ulong           custAttr;                       // attribute bits defined by software
  491.         ProcessSerialNumber     process;        // PSN of installer
  492.         ulong           reserved2;                      // reserved
  493.         UniversalProcPtr        Control;        // pointer to a control function
  494.         ulong           refCon                          // pointer or handle for private use
  495. // optionally, more software-specific data may
  496. // follow directly as part of the same structure
  497. } INITGestaltRec, *INITGestaltRecPtr, **INITGestaltRecHandle;
  498.  
  499. enum
  500. {
  501.         kIGRecType                              = 'JRRR',
  502.         kIGRecCurrentVersion    = $01006001,
  503.         
  504.         //      bit constants for the stdAttr field
  505.         kIGEnabled = 0,
  506.         kIGDebugVersion,
  507.         kIGDebugEnabled,
  508.         kIGPPCNative,
  509.         kIGAcceptsAEvents,
  510.  
  511.         // basic selectors for the Control function
  512.         kIGCtrlEnableGet                = 0,
  513.         kIGCtrlEnableSet,
  514.         kIGCtrlDebugGet,
  515.         kIGCtrlDebugSet,
  516.         kIGCtrlGetFSSpec,
  517.         kIGCtrlGetMemSize,
  518.  
  519.         // user selector area
  520.         kIGFirstUserSelector    = 1000
  521.  
  522.         // result codes for the Control function
  523.         kIGNoErr                                = noErr,        // No Error
  524.         kIGUnimplErr                    = 5554,         // Control function selector not
  525.                                                                                 //      implemented
  526.         kIGAnswerUnknown                = 5555,         // Requested information not
  527.                                                                                 //      available
  528.         kIGMsgInvalidErr                = 5556,         // Message parameter invalid
  529. }
  530.  
  531.  
  532. PASCAL:
  533. type
  534. INITGestaltRec =        record
  535.         recType:        OSType;                         {must always be kGestaltRecordType}
  536.         recVersion:     NumVersion;                     {the version of the record format}
  537.         version:        NumVersion;                     {version of installed software}
  538.         stdAttr:        LongInt;                        {attribute bits defined by standard}
  539.         reserved1:      LongInt;                        {reserved, for more attribute bits}
  540.         custAttr:       LongInt;                        {attribute bits defined by software}
  541.         process:        ProcessSerialNumber     {PSN of installer}
  542.         reserved2:      LongInt;                        {reserved}
  543.         Control:        UniversalProcPtr;       {pointer to a control function}
  544.         refCon:         LongInt;                        {pointer or handle for private use}
  545.         { optionally, more software-specific data may }
  546.         { follow directly as part of the same structure }
  547.         end;
  548.  
  549. INITGestaltRecPtr = ^INITGestaltRec;
  550. INITGestaltRecHandle = ^INITGestaltRecPtr;
  551.  
  552. const
  553.         kIGRecType                              = 'JRRR';
  554.         kIGRecCurrentVersion    = $01006001;
  555.  
  556.         {bit constants for the stdAttr field}
  557.         kIGEnabled                              = 0;
  558.         kIGDebugVersion                 = 1;
  559.         kIGDebugEnabled                 = 2;
  560.         kIGPPCNative                    = 3;
  561.         kIGAcceptsAEvents               = 4;
  562.  
  563.         {basic messages for the Control function}
  564.         kIGCtrlEnableGet                = 0;
  565.         kIGCtrlEnableSet                = 1;
  566.         kIGCtrlDebugGet                 = 2;
  567.         kIGCtrlDebugSet                 = 3;
  568.         kIGCtrlGetFSSpec                = 4;
  569.         kIGCtrlGetMemSize               = 5;
  570.         {user selector area}
  571.         kIGFirstUserSelector    = 1000;
  572.  
  573.         {result codes for the Control function}
  574.         kIGNoErr                                = noErr;        {No Error}
  575.         kIGUnimplErr                    = 5554;         {Control function selector not}
  576.                                                                                 {       implemented}
  577.         kIGAnswerUnknown                = 5555;         {Requested information not}
  578.                                                                                 {       available}
  579.         kIGMsgInvalidErr                = 5556;         {Message parameter invalid}
  580.  
  581.  
  582. recType
  583.         This field must always contain 'JRRR' (kIGRecType) to indicate it
  584.         supports the INITGestaltRec as defined by this standard.
  585.  
  586. recVersion
  587.         Contains a version number indicating the version of the INITGestalt
  588.         standard to which the INITGestaltRec complies. This field should be
  589.         filled using the kIGRecCurrentVersion constant. The version number is
  590.         in the same format as the first four bytes of a 'vers' resource.
  591.         This version number changes when fields are added or changed and also
  592.         when more attribute bits are defined.
  593.  
  594. version
  595.         Holds the version of installed software in the same format as the first
  596.         four bytes of a 'vers' resource.
  597.  
  598. stdAttr
  599.         Holds attribute bits defined by this standard to indicate certain
  600.         capabilities. The following bits are currently defined, the others must
  601.         always be set to zero.
  602.  
  603.         kIGEnabled
  604.                 If set, the installed software is currently enabled.
  605.  
  606.         kIGDebugVersion
  607.                 If set, the installed software is a debugging version.
  608.  
  609.         kIGDebugEnabled
  610.                 If set, the installed software is a debugging version and supports
  611.                 a debug mode which can be turned on and off (this bit can never be
  612.                 set if kIGDebugVersion is unset).
  613.  
  614.         kIGPPCNative
  615.                 If set the installed software is fully PowerPC native code or
  616.                 contains "fat" trap patches
  617.  
  618.         kIGAcceptsAEvents
  619.                 If set, the installed software can accept AppleEvents
  620.  
  621. reserved1
  622.         Reserved, possibly for more attribute bits defined by this standard.
  623.         Should be set to zero.
  624.  
  625. custAttr
  626.         Holds attribute bits defined by the software which installed this
  627.         selector pointing to the INITGestaltRec record. The developer can use
  628.         this field for attribute bits only and should define them with the
  629.         documentation as much as possible. Undefined bits must always be set to
  630.         zero.
  631.         
  632. process
  633.         Holds the Process Serial Number of the process which installed this
  634.         selector. If no process is associated this field must be zero
  635.         (kNoProcess). The other Process Manager constants kSystemProcess and
  636.         kCurrentProcess should not be used.
  637.  
  638. reserved2
  639.         Reserved for future use. Should be set to zero.
  640.  
  641. Control
  642.         Address to a function which can control the software. In addition, it
  643.         can be used to return more info from the installed software to other
  644.         applications than possible with the other mechnisms of this standard
  645.         If the control function can't be used set this field to nil.
  646.  
  647.         The control function must look like this:
  648.  
  649.                 C:              pascal OSErr IGControl (long selector, void *message);
  650.                 PASCAL: Function IGControl (selector: LongInt;
  651.                                                                         var message: LongInt): OSErr;
  652.  
  653.         The IGControl function allows the extension to be controlled by other
  654.         applications or to return information requested by other applications.
  655.         The selector variable indicates what type of control is applied or what
  656.         type of information is requested. All values between 0 and
  657.         kIGFirstUserSelector (which translates to 1000) are reserved for use by
  658.         this standard. All positive values starting at kIGFirstUserSelector are
  659.         free to be used by your software. Negative values should not be used.
  660.         Calling this function should be safe at interrupt time.
  661.         If the software allows control by Apple events it should implement this
  662.         Control function, even if it duplicates the task of Apple events. This
  663.         function is more generic and doesn't require knowledge about a private
  664.         event class.
  665.  
  666.         Below is a list of selector values defined with this standard. None of
  667.         these selectors are required to be implemented, but we ask you to
  668.         implement them when possible.
  669.         
  670.         (Note to Pascal users: 'a pointer to a Boolean value' simply means that
  671.          you have to cast the message parameter to a Boolean. This description
  672.          is useful for C programmers, since Pascal knows the var mechanism).
  673.  
  674.         kIGCtrlEnableGet
  675.                 Retrieves the current state of the installed software. The message
  676.                 parameter is a pointer to a Boolean value, which is ignored on input
  677.                 but is set to 0 (inactive) or 1 (active) on return.
  678.                 If the software does not support disabling it should put 1 in
  679.                 the message parameter and return kIGNoErr.
  680.                 This selector can be used together with the kIGCtrlEnableSet
  681.                 selector which is described below.
  682.  
  683.         kIGCtrlEnableSet
  684.                 Enables or disables the installed software temporary depending on
  685.                 the input value of the message parameter (pointer to a Boolean
  686.                 value). Changing the state should not survive stopping and starting
  687.                 the software (by quitting or restart)
  688.                 Passing 0 (zero) in the message parameter disables the software,
  689.                 while 1 (one) enables it. The message should contain the previous
  690.                 state after completion. The Control function code should change the
  691.                 kIGEnabled bit accordingly.
  692.                 If the software does not support disabling it should return a
  693.                 kIGUnimplErr error message.
  694.                 This selector can be used to temporary disable software, i.e.
  695.                 to prevent conflicts.
  696.  
  697.         kIGCtrlDebugGet
  698.                 Retrieves the current state of the debug mode of the installed
  699.                 software. The message parameter is a pointer to a Boolean value,
  700.                 which is ignored on input but is set to 0 (inactive) or 1 (active)
  701.                 on return.
  702.                 If the software does not support a debug mode it should put 0 in
  703.                 the message parameter and return kIGNoErr.
  704.                 This selector can be used together with the kIGCtrlDebugSet
  705.                 selector which is described below.
  706.  
  707.         kIGCtrlDebugSet
  708.                 Enables or disables the debug mode of the installed software
  709.                 depending on the input value of the message parameter (pointer to a
  710.                 Boolean value).
  711.                 Passing 0 (zero) in the message parameter turns the debug mode off,
  712.                 while 1 (one) turns it on. The message should contain the previous
  713.                 state after completion. The Control function code should change the
  714.                 kIGDebugEnabled bit accordingly.
  715.                 If the software does not support a debug mode it should return a
  716.                 kIGUnimplErr error message.
  717.                 This selector allows other software to turn the debug mode of the
  718.                 software on or off on the fly. This can be useful for certain
  719.                 utilities which are part of your software suite.
  720.  
  721.         kIGCtrlGetFSSpec
  722.                 Returns the location of the installed software as an FSSpec. The
  723.                 message parameter should contain a pointer to a FSSpec record which
  724.                 will be filled by the Control function.
  725.                 The function result should be kIGAnswerUnknown when the location is
  726.                 unknown or the user moved the software and it cannot be found.
  727.                 This selector can be used to determine the location of the active
  728.                 part of the software and allow management software to move it outside
  729.                 the system folder.
  730.  
  731.         kIGCtrlGetMemSize
  732.                 Returns the total memory usage of the installed software. The
  733.                 message parameter is of type Size and holds on return the total
  734.                 memory usage in bytes.
  735.                 If the memory size is unknown the function result must be
  736.                 kIGAnswerUnknown.
  737.                 This selector can be used to determine the memory usage by your
  738.                 software for display purposes and statistics.
  739.  
  740.         If you define your own selector and you think it may be usefull to have
  741.         it defined with this standard, please let the undersigned know about
  742.         it.
  743.         Please publish the selectors, you defined for your own use, in the
  744.         documentation of your software. Ofcourse you're free to keep them
  745.         private if you really want.
  746.         The function returns kIGNoErr if it succeeds, otherwise an OSErr
  747.         explaining why it failed. The following error messages can be used:
  748.  
  749.         kIGNoErr
  750.                 No error occured, the Control function executed properly.
  751.  
  752.         kIGUnimplErr
  753.                 The selector code is not implemented by the called Control
  754.                 function.
  755.  
  756.         kIGAnswerUnknown
  757.                 The selector code is implemented but the requested information
  758.                 could not be returned.
  759.  
  760.         kIGMsgInvalidErr
  761.                 The message code was found to be invalid by the Control function
  762.                 for use with the specified selector.
  763.  
  764. refCon
  765.         Pointer or Handle to another block with custom and/or private data.
  766.         Should be nil if not used. In any event, the caller should not attempt
  767.         to dispose of the data block to which refCon points. One obvious use
  768.         of refCon would be to allow communication between a control panel and
  769.         its INIT component.
  770.  
  771. 4. Further extension-specific data could follow. This could include further
  772. communication functions to allow more detailed control or use of the
  773. extension, if this were deemed desirable.
  774.  
  775. 5. If your software installs a selector which adopts this standard, you
  776. should email your documentation, which includes a description of the custom
  777. fields, to Rene G.A. Ros for inclusion with the Gestalt Selectors List
  778. (GSL). An entry in the GSL would look like this:
  779.  
  780.         ======================================================================
  781.         SWVE (SimpleWave ext [1.0b1] by Rene G.A. Ros)
  782.              gestaltSimpleWaveTable
  783.              Returns a pointer to an INITGestalt structure.
  784.  
  785.              const
  786.              gestaltSimpleWaveTable = 'SWVE';
  787.         ======================================================================
  788.  
  789.  
  790. The code required to implement the basic functionality would be very small
  791. and very easy to write.
  792.  
  793. Comments on this proposal please: post rather than email.
  794.  
  795. Jeremy Roussak (jeremyr@dcs.qmw.ac.uk)
  796.  
  797. Rene G.A. Ros (rgaros@bio.vu.nl)
  798.  
  799.  
  800. The following persons contributed ideas and corrections for which we want
  801. to thank them:
  802.         Dave Ely (ely@netcom.com)
  803.         Bill Hofmann (wdh@fresh.com)
  804.         John Mancino (mancino@decismkr.com)
  805.         Jens Miltner (jmiltner@theorie3.physik.uni-erlangen.de)
  806.         Alessandro Levi Montalcini (LMontalcini@pmn.it)
  807.         Fabrizio Oddone (gspnx@di.unito.it)
  808.         Quinn "The Eskimo" (quinn@cs.uwa.edu.au)
  809.         Hans Verbrugge (hverbrug@inter.nl.net)
  810.  
  811. - -------------------------------------------------------------------------
  812. Changes
  813.         1.0b1 (31 January 1995)
  814.         -       changed recVersion to NumVersion type.
  815.  
  816. - -------------------------------------------------------------------------
  817. History
  818. This proposal was initially written in 1992 for use by extensions by
  819. Jeremy Roussak based on an idea by Rene Ros. It never saw daylight because
  820. of other projects. After almost two year we saw some need for changes and
  821. to make it generally usuable for applications as well.
  822.  
  823. +++++++++++++++++++++++++++
  824.  
  825. >From oster@netcom.com (David Phillip Oster)
  826. Date: Thu, 2 Feb 1995 09:20:40 GMT
  827. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  828.  
  829. In article <3gpd2i$qut@dartvax.dartmouth.edu> Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) writes:
  830.  
  831. _>First, I will point out the two weaknesses of a pure gestalt approach,
  832.  
  833. _>1) Gestalt is quite well suited to the task, but there is an
  834. _>ever-so-slight performance penalty as more selectors are added to the
  835. _>Gestalt table.
  836. _>2) The current mechanism offers no enumeration capabilities.  
  837. _>there is no simple way to ask the question "what extensions are
  838. _>installed?"
  839. _>So, what I propose is that there be _one_ selector which serves as a
  840. _>jumping off point for registration of all extensions.  This selector
  841. _>points to a simple OS QHdr.  Enqueue'd on this header are records of
  842. _>type INITGestaltRec (as per the previous spec) with two slight
  843. _>modifications: ...
  844.  
  845. Congratulations, you've just re-invented the wheel. I agree with the
  846. problems,., but solution is Component Manager, which already exists,
  847. not another piece of code that does the same thing.
  848. -- 
  849. - ------- oster@netcom.com ----------
  850. There is no sight finer than that of the planet Earth in your rearview mirror.
  851.  
  852.  
  853.  
  854. +++++++++++++++++++++++++++
  855.  
  856. >From Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu)
  857. Date: 2 Feb 1995 15:51:13 GMT
  858. Organization: Dartmouth College, Hanover, NH
  859.  
  860. In article <osterD3D8MG.BA3@netcom.com>
  861. oster@netcom.com (David Phillip Oster) writes:
  862. > Congratulations, you've just re-invented the wheel. I agree with the
  863. > problems,., but solution is Component Manager, which already exists,
  864. > not another piece of code that does the same thing.
  865.  
  866. Well, gee...  Maybe you can point out how the Component Manager can be
  867. used to do this and thus join in the discussion with some real
  868. information.
  869.  
  870. For instance, I'm not convinced that the Component Manager is the right
  871. solution (I don't know that much about it, though).  What I do know is
  872. that the Component Manager was originally part of QuickTime.  Is it
  873. built into all versions of System 7?  When does it load?  Can it be
  874. loaded by an INIT if it is not there?  Will we have to license it from
  875. Apple in order to get it on System 7.0?  Can it run under System 6
  876. (this would be good, because Gestalt is not implemented on all
  877. systems)?  What are the real drawbacks, if there are any?
  878.  
  879. I agree that the design of this INIT Gestalt gizmo has much in common
  880. with the Component Manager, but the code is so ultra-trivial that it
  881. would not really be "re-inventing the wheel" to write a few queue
  882. access routines.
  883.  
  884. So, convince everyone (who's listening) that the Component Manager is
  885. the way to go, and you may just save us from ourselves ;-)
  886.  
  887. Mark.
  888.  
  889. +++++++++++++++++++++++++++
  890.  
  891. >From grobbins@apple.com (Grobbins)
  892. Date: 6 Feb 1995 11:17:04 -0800
  893. Organization: Skunkworks
  894.  
  895. Publicizing pointers and handles with the Gestalt Manager is convenient,
  896. but it's also an abuse of the Gestalt facility.  The notion of getting
  897. a pointer to a completely independent piece of code is very non-savvy
  898. with respect to any future architectures that provide for multiple 
  899. address spaces.
  900.  
  901. There are supported interfaces usable by non-application code, such as
  902. the interfaces provided for drivers and components, and the PPC Toolbox
  903. is a supported communications mechanism for all types of code.  Passing
  904. around handles and procptrs may be simple, but it's poor practice and
  905. will tend to bite you later.
  906.  
  907. Grobbins                      grobbins@apple.com
  908.  
  909. Usual disclaimers apply.
  910.  
  911.  
  912. +++++++++++++++++++++++++++
  913.  
  914. >From grobbins@apple.com (Grobbins)
  915. Date: 6 Feb 1995 11:17:04 -0800
  916. Organization: Skunkworks
  917.  
  918. Publicizing pointers and handles with the Gestalt Manager is convenient,
  919. but it's also an abuse of the Gestalt facility.  The notion of getting
  920. a pointer to a completely independent piece of code is very non-savvy
  921. with respect to any future architectures that provide for multiple 
  922. address spaces.
  923.  
  924. There are supported interfaces usable by non-application code, such as
  925. the interfaces provided for drivers and components, and the PPC Toolbox
  926. is a supported communications mechanism for all types of code.  Passing
  927. around handles and procptrs may be simple, but it's poor practice and
  928. will tend to bite you later.
  929.  
  930. Grobbins                      grobbins@apple.com
  931.  
  932. Usual disclaimers apply.
  933.  
  934.  
  935. +++++++++++++++++++++++++++
  936.  
  937. >From caleb@delbruck.pharm.sunysb.edu (Caleb Strockbine)
  938. Date: 10 Feb 1995 16:07:45 GMT
  939. Organization: SUNY Stony Brook
  940.  
  941. In article <3herhv$smo@dartvax.dartmouth.edu> Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) writes:
  942. >In article <3h5sjg$6as@apple.com>, grobbins@apple.com (Grobbins) wrote:
  943. >> There are supported interfaces usable by non-application code, such as
  944. >> the interfaces provided for drivers and components, and the PPC Toolbox
  945. >> is a supported communications mechanism for all types of code.  Passing
  946. >> around handles and procptrs may be simple, but it's poor practice and
  947. >> will tend to bite you later.
  948.  
  949. I'd have to agree with Grobbins. Seems like there are plenty of supported
  950. mechanisms for providing services for all processes. Why abuse the Gestalt
  951. manager when you can use another manager properly?
  952.  
  953. >Now, what is the chance of old-style INITs being around in a system
  954. >with seperate memory spaces?  Oh, so you'll put all extensions in one
  955. >common memory space (or a shared system area in each app's space)? 
  956. >Well, uh, doesn't that mean we can pass pointers without fear of memory
  957. >faults?
  958.  
  959. I'd say the probability of someone using old extensions in a new system
  960. must be 1. Sure, passing pointers around inside a common memory space would
  961. be okay, but that means that nobody else could use your INITGestalt package.
  962. Why shouldn't processes in other memory spaces be able to use it as well?
  963.  
  964. >So far, suggestions for using the Component Manager and PPC Toolbox
  965. >have been made, but with not a hint about how they might be used. 
  966. >Perhaps when a suggestion is made, the author could include at least
  967. >one argument why their method is worth considering, possibly with an
  968. >outline of how the method might be implemented.  Hmmm?
  969.  
  970. You could use the Component Manager in a couple of ways. One would be to
  971. write a standard component which maintains a database of services which 
  972. register themselves. Another would be to have each extension register itself
  973. as a component of type 'INIT' or something like that. The Component 
  974. Manager provides nice tools for finding particular components or all
  975. the components of a particular type, which seems to be the functionality
  976. you're looking for. Extensions registering as components could support
  977. any number of useful functions, including calls to turn them on/off, 
  978. provide information about themselves, report how much memory they're
  979. currently using, report whether they're currently working or not and
  980. why ("This extension was turned off by the user"/"This extension doesn't
  981. work with virtual memory"), etc. Individual extensions could also provide
  982. extended interfaces for easy integration with other kinds of code.
  983. Hmmm... this is sounding good... maybe I'll go write some of this up
  984. tonight.
  985.  
  986. I don't remember all that much about the PPC toolbox, but one would 
  987. imagine that it supports a similar registration system that extensions
  988. could use to register themselves and which other processes could use to
  989. find such registered extensions.
  990.  
  991. Both of these systems are better than using Gestalt to pass function
  992. pointers around simply because they make use of the OS as it was
  993. intended to be used. They don't make assumptions that might limit
  994. Apple's ability to extend the OS or which might break in future 
  995. revisions of the OS. Using Gestalt for interprocess communication
  996. is pretty skanky.
  997.  
  998. Caleb Strockbine
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004. -- 
  1005.  
  1006. .........................................................................
  1007. "It isn't always just how you look. Look at me. I'm handsome like anything
  1008.  and I haven't got anybody to marry me yet." -- Brian, age 7
  1009.  
  1010. +++++++++++++++++++++++++++
  1011.  
  1012. >From Jaeger@fquest.com (Brian Stern)
  1013. Date: 11 Feb 1995 16:31:41 GMT
  1014. Organization: The University of Texas at Austin, Austin, Texas
  1015.  
  1016. In article <3h5sjg$6as@apple.com>, grobbins@apple.com (Grobbins) wrote:
  1017.  
  1018. < Publicizing pointers and handles with the Gestalt Manager is convenient,
  1019. < but it's also an abuse of the Gestalt facility.  The notion of getting
  1020. < a pointer to a completely independent piece of code is very non-savvy
  1021. < with respect to any future architectures that provide for multiple 
  1022. < address spaces.
  1023. < There are supported interfaces usable by non-application code, such as
  1024. < the interfaces provided for drivers and components, and the PPC Toolbox
  1025. < is a supported communications mechanism for all types of code.  Passing
  1026. < around handles and procptrs may be simple, but it's poor practice and
  1027. < will tend to bite you later.
  1028. < Grobbins                      grobbins@apple.com
  1029. < Usual disclaimers apply.
  1030.  
  1031. Admonishing developers to do things the right way is all well and good but
  1032. what we really need is working example code.  People use Gestalt for this
  1033. because it is much simpler to implement than PPC-toolbox.  Most people are
  1034. familiar with the Gestalt Manager; few are familiar with PPC-toolbox.  
  1035.  
  1036. I remember looking at the INIT-CDEV example when I first needed this
  1037. functionality and thinking that it was too complicated.  I just looked at
  1038. it again and I understand it better now.  Of course this example goes to
  1039. all this trouble to make a PPC-Toolbox connection between the INIT and the
  1040. CDEV and what information does it pass?  A pointer to the INIT's globals. 
  1041. Oh well.
  1042.  
  1043. -- 
  1044. Brian  Stern  :-{)}
  1045. Toolbox commando and Menu bard
  1046. Jaeger@fquest.com
  1047.  
  1048. +++++++++++++++++++++++++++
  1049.  
  1050. >From Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu)
  1051. Date: 11 Feb 1995 18:09:17 GMT
  1052. Organization: Dartmouth College, Hanover, NH
  1053.  
  1054. In article <3hg30h$p21@adam.cc.sunysb.edu>
  1055. caleb@delbruck.pharm.sunysb.edu (Caleb Strockbine) writes:
  1056. > In article <3herhv$smo@dartvax.dartmouth.edu> Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) writes:
  1057. > >In article <3h5sjg$6as@apple.com>, grobbins@apple.com (Grobbins) wrote:
  1058. > >> There are supported interfaces usable by non-application code, such as
  1059. > >> the interfaces provided for drivers and components, and the PPC Toolbox
  1060. > >> is a supported communications mechanism for all types of code.  Passing
  1061. > >> around handles and procptrs may be simple, but it's poor practice and
  1062. > >> will tend to bite you later.
  1063. > I'd have to agree with Grobbins. Seems like there are plenty of supported
  1064. > mechanisms for providing services for all processes. Why abuse the Gestalt
  1065. > manager when you can use another manager properly?
  1066.  
  1067. I think most of us (well, I can only speak for myself) agree with that
  1068. on the most general level, as well as in this specific case.
  1069.  
  1070. > >Now, what is the chance of old-style INITs being around in a system
  1071. > >with seperate memory spaces?  Oh, so you'll put all extensions in one
  1072. > >common memory space (or a shared system area in each app's space)? 
  1073. > >Well, uh, doesn't that mean we can pass pointers without fear of memory
  1074. > >faults?
  1075. > I'd say the probability of someone using old extensions in a new system
  1076. > must be 1. Sure, passing pointers around inside a common memory space would
  1077. > be okay, but that means that nobody else could use your INITGestalt package.
  1078. > Why shouldn't processes in other memory spaces be able to use it as well?
  1079.  
  1080. Yes, I hope I don't have to chuck all my extensions for the new OS. 
  1081. But, if they still work with the new OS, then they will likely have to
  1082. be located in some shared memory area (shared by all apps, that is),
  1083. and any INIT registration mechanism will likewise be located in shared
  1084. memory.  This means that "processes in other memory spaces" _will_ be
  1085. able to use the INITGestalt package.  Of course I don't pretend to know
  1086. how the new OS will handle old-style extensions, so we should not .
  1087.  
  1088. > You could use the Component Manager in a couple of ways. One would be to
  1089. > write a standard component which maintains a database of services which 
  1090. > register themselves. Another would be to have each extension register itself
  1091. > as a component of type 'INIT' or something like that. The Component 
  1092. > Manager provides nice tools for finding particular components or all
  1093. > the components of a particular type, which seems to be the functionality
  1094. > you're looking for.
  1095.  
  1096. Thanks for taking a stab at explaining the possibilities with the
  1097. component manager.  The fact that this functionality is available in an
  1098. existing manager is indeed justification enough for using it over
  1099. Gestalt.  One question remains:  what is the availability of the
  1100. component manager?  Is it only present with QuickTime? System 7?  Is
  1101. there an extension for System 6?  How about System 3.2?  ;-)  Gestalt
  1102. has this weakness, too (available only only on recent systems).
  1103.  
  1104. > Extensions registering as components could support
  1105. > any number of useful functions, including calls to turn them on/off, 
  1106. > provide information about themselves, report how much memory they're
  1107. > currently using, report whether they're currently working or not and
  1108. > why ("This extension was turned off by the user"/"This extension doesn't
  1109. > work with virtual memory"), etc. Individual extensions could also provide
  1110. > extended interfaces for easy integration with other kinds of code.
  1111. > Hmmm... this is sounding good... maybe I'll go write some of this up
  1112. > tonight.
  1113.  
  1114. Yes, this much we have already figured out - what you outline is what
  1115. the initial proposal was trying to accomplish.  But don't let me stop
  1116. you from providing the implementation!  Before you do so, I suggest you
  1117. read the original proposal, which you can get from its authors by
  1118. sending mail to gestalt-selectors-list-request@bio.vu.nl.
  1119.  
  1120. I can hardly wait to use your code ;-)
  1121.  
  1122. Mark.
  1123.  
  1124.  
  1125. +++++++++++++++++++++++++++
  1126.  
  1127. >From caleb@delbruck.pharm.sunysb.edu (Caleb Strockbine)
  1128. Date: 12 Feb 1995 15:33:46 GMT
  1129. Organization: SUNY Stony Brook
  1130.  
  1131. In article <3hiugd$k0v@dartvax.dartmouth.edu> Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) writes:
  1132. >Thanks for taking a stab at explaining the possibilities with the
  1133. >component manager.  The fact that this functionality is available in an
  1134.  
  1135.  
  1136. Sure thing. I'd be pleased if Grobbins would tell us whether what I described
  1137. is close to what he was thinking. Good to have agreement on these things.
  1138.  
  1139.  
  1140. >existing manager is indeed justification enough for using it over
  1141. >Gestalt.  One question remains:  what is the availability of the
  1142. >component manager?  Is it only present with QuickTime? System 7?  Is
  1143. >there an extension for System 6?  How about System 3.2?  ;-)  Gestalt
  1144. >has this weakness, too (available only only on recent systems).
  1145.  
  1146.  
  1147. >From "NIM: More Macintosh Toolbox":
  1148.   "The Component Manager is available in System 7.1 or later and may
  1149.    be present in System 7..."
  1150.  
  1151. It's also available anywhere QuickTime is found. Plenty of other 
  1152. parts of the system use it as well.
  1153.  
  1154.  
  1155. >read the original proposal, which you can get from its authors by
  1156. >sending mail to gestalt-selectors-list-request@bio.vu.nl.
  1157.  
  1158.  
  1159. I've got it saved somewhere...I'll certainly re-read it.
  1160.  
  1161.  
  1162. >I can hardly wait to use your code ;-)
  1163.  
  1164.  
  1165. I can hardly wait to use it myself! :-) Suggestions from anyone who cares
  1166. to make them are always welcome.
  1167.  
  1168. Caleb Strockbine
  1169. caleb@delbruck.sunysb.edu
  1170. -- 
  1171.  
  1172. .........................................................................
  1173. "It isn't always just how you look. Look at me. I'm handsome like anything
  1174.  and I haven't got anybody to marry me yet." -- Brian, age 7
  1175.  
  1176. +++++++++++++++++++++++++++
  1177.  
  1178. >From Michael D. Moore <moorem@efn.org>
  1179. Date: 13 Feb 1995 03:58:07 GMT
  1180. Organization: -
  1181.  
  1182. In article <mxmora-0902950831490001@xavier.sri.com> Matthew Xavier Mora,
  1183. mxmora@unix.sri.com writes:
  1184. >In article <3h5sjg$6as@apple.com>, grobbins@apple.com (Grobbins) wrote:
  1185. >> There are supported interfaces usable by non-application code, such as
  1186. >> the interfaces provided for drivers and components, and the PPC Toolbox
  1187. >> is a supported communications mechanism for all types of code.  Passing
  1188. >> around handles and procptrs may be simple, but it's poor practice and
  1189. >> will tend to bite you later.
  1190. >
  1191. >Could you please expand on what we would need to do to use either PPC
  1192. >toolbox or the component manager  instead of Gestalt?
  1193.  
  1194. Agreed.  I switched from using a "null" device driver to store the address
  1195. of my globals to a Gestalt function because I was told that creating
  1196. additional device drivers is a bad idea (agreed!).  When I saw Mr.
  1197. Grobbins
  1198. article, I was wondering how he would suppose to use PPC to communicate
  1199. this
  1200. information from an INIT.  Maybe installing a system (global) event
  1201. handler?
  1202. I could use some more information on that.
  1203.  
  1204. I was more interested in the Component Manager idea, so I read up on it. 
  1205. It's
  1206. quite a bit more work, but I could do it.  However, I cannot find a list
  1207. of
  1208. existing component types or the information on how to register a new one.
  1209.  The
  1210. IM docs suggest it should and must be registered, but AppleLink, the TIL
  1211. and
  1212. Apple's WWW and FTP offer no information on the Component Registry.  Some
  1213. info
  1214. on this would help if this is the "right way" to do things.
  1215.  
  1216. Thanks,
  1217.  
  1218. Michael
  1219. - -------------------------
  1220. Official Motto of the Federal Government:
  1221. "This Motto Alone Cost $13.2 Billion"  -Dave Barry
  1222.  
  1223. +++++++++++++++++++++++++++
  1224.  
  1225. >From Jaeger@fquest.com (Brian Stern)
  1226. Date: 13 Feb 1995 15:14:04 GMT
  1227. Organization: The University of Texas at Austin, Austin, Texas
  1228.  
  1229. In article <3h5sjg$6as@apple.com>, grobbins@apple.com (Grobbins) wrote:
  1230.  
  1231. < Publicizing pointers and handles with the Gestalt Manager is convenient,
  1232. < but it's also an abuse of the Gestalt facility.  The notion of getting
  1233. < a pointer to a completely independent piece of code is very non-savvy
  1234. < with respect to any future architectures that provide for multiple 
  1235. < address spaces.
  1236. < There are supported interfaces usable by non-application code, such as
  1237. < the interfaces provided for drivers and components, and the PPC Toolbox
  1238. < is a supported communications mechanism for all types of code.  Passing
  1239. < around handles and procptrs may be simple, but it's poor practice and
  1240. < will tend to bite you later.
  1241. < Grobbins                      grobbins@apple.com
  1242. < Usual disclaimers apply.
  1243.  
  1244. OK.  I'm convinced that using the Component Manager is the way to go
  1245. here.  I don't think PPC toolbox is appropriate in most cases.  Usually
  1246. we're only talking about a few bytes that need to be transferred between
  1247. INITs and CDEVs or applications.
  1248.  
  1249. I think that Apple should take the lead here.  We need an 'init' component
  1250. defined, along with a few messages.  I think 'turn on', turn off', 'get
  1251. status' and 'set status' messages should be defined.  Maybe a few others
  1252. as well.
  1253.  
  1254. The SAVR/SAVC mechanism is a gestalt-based method for doing these sorts of
  1255. things.  A Component Manager-based mechanism should be able to do what
  1256. SAVR/SAVC does without being much more complex.
  1257.  
  1258. We need sample code including a standard header file to be used for all
  1259. INITs that use this mechanism.
  1260.  
  1261. I think there would be lots of benefits from a standard interface for all
  1262. conforming extensions.  Imagine being able to turn off specified inits
  1263. from applications.
  1264.  
  1265. -- 
  1266. Brian  Stern  :-{)}
  1267. Toolbox commando and Menu bard
  1268. Jaeger@fquest.com
  1269.  
  1270. +++++++++++++++++++++++++++
  1271.  
  1272. >From jwbaxter@olympus.net (John W. Baxter)
  1273. Date: Mon, 13 Feb 1995 07:38:05 -0800
  1274. Organization: Internet for the Olympic Peninsula
  1275.  
  1276. Component Manager availability:
  1277.  
  1278.    System 7.1 and up.
  1279.  
  1280.    Prior systems with QuickTime installed (as far back as QT will install,
  1281. whatever that 6.0.???).
  1282.  
  1283.        --John
  1284.  
  1285. -- 
  1286. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1287.        Isn't C fun?
  1288.    jwbaxter@pt.olympus.net
  1289.  
  1290. +++++++++++++++++++++++++++
  1291.  
  1292. >From caleb@delbruck.pharm.sunysb.edu (Caleb Strockbine)
  1293. Date: 13 Feb 1995 18:55:22 GMT
  1294. Organization: SUNY Stony Brook
  1295.  
  1296. In article <Jaeger-1302950922040001@slip-12-12.ots.utexas.edu> Jaeger@fquest.com (Brian Stern) writes:
  1297. >OK.  I'm convinced that using the Component Manager is the way to go
  1298. >here.  I don't think PPC toolbox is appropriate in most cases.  Usually
  1299.  
  1300. Good! A concensus is forming!
  1301.  
  1302. >I think that Apple should take the lead here.  We need an 'init' component
  1303. >defined, along with a few messages.  I think 'turn on', turn off', 'get
  1304. >status' and 'set status' messages should be defined.  Maybe a few others
  1305.  
  1306. Yikes! I'm halfway done already! Hope I don't get nosed out by Apple... :-)
  1307. I've got messages for turning extensions on and off, getting their status,
  1308. and getting information already defined. I've been thinking it might be
  1309. useful if an extension could also tell you what traps it patches, so that
  1310. might be a seperate message. Can anyone think of anything else that'd
  1311. be useful? 
  1312.  
  1313. >The SAVR/SAVC mechanism is a gestalt-based method for doing these sorts of
  1314. >things.  A Component Manager-based mechanism should be able to do what
  1315. >SAVR/SAVC does without being much more complex.
  1316.  
  1317. What I've got so far is pretty simple. Easy to understand and easy to use.
  1318. Then again, I wrote it... I suppose I should let everyone else decide how
  1319. easy to use it really is. But there's honestly nothing very complicated.
  1320. High on my list of priorities is making it very easy to convert old-style
  1321. extensions to use the component interface.
  1322.  
  1323. >We need sample code including a standard header file to be used for all
  1324. >INITs that use this mechanism.
  1325.  
  1326. Got that.
  1327.  
  1328. >I think there would be lots of benefits from a standard interface for all
  1329. >conforming extensions.  Imagine being able to turn off specified inits
  1330. >from applications.
  1331.  
  1332. Exactly. Or get a list of all installed conforming extensions. I'll make
  1333. what I've done available as soon as it's done. I don't want to make
  1334. promises I can't keep, but it shouldn't be very long.
  1335.  
  1336. Caleb Strockbine
  1337. caleb@delbruck.sunysb.edu
  1338.  
  1339. +++++++++++++++++++++++++++
  1340.  
  1341. >From Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu)
  1342. Date: 13 Feb 1995 22:38:44 GMT
  1343. Organization: Dartmouth College, Hanover, NH
  1344.  
  1345. In article <3ho9uq$lvv@adam.cc.sunysb.edu>
  1346. caleb@delbruck.pharm.sunysb.edu (Caleb Strockbine) writes:
  1347. > >I think that Apple should take the lead here.  We need an 'init' component
  1348. > >defined, along with a few messages.  I think 'turn on', turn off', 'get
  1349. > >status' and 'set status' messages should be defined.  Maybe a few others
  1350. > Yikes! I'm halfway done already! Hope I don't get nosed out by Apple... :-)
  1351. > I've got messages for turning extensions on and off, getting their status,
  1352. > and getting information already defined. I've been thinking it might be
  1353. > useful if an extension could also tell you what traps it patches, so that
  1354. > might be a seperate message. Can anyone think of anything else that'd
  1355. > be useful? 
  1356.  
  1357. I disagree that we should depend on Apple to do this.  They do not have
  1358. a monopoly on good design, nor do they have infinite resources.  Let's
  1359. leave them to concentrate on making a great OS, and we can fill in the
  1360. utilities ;-)
  1361.  
  1362. Now, I'd really like to see some comments from the original proposers,
  1363. who have already written some code, and who might have some design
  1364. ideas for a Component Manager based solution.  Are you guys out there?
  1365.  
  1366. Mark.
  1367.  
  1368.  
  1369. +++++++++++++++++++++++++++
  1370.  
  1371. >From sandvik@apple.com (Kent Sandvik)
  1372. Date: Tue, 14 Feb 1995 23:24:37 -0800
  1373. Organization: Apple Computer, Inc. Developer Technical Support
  1374.  
  1375. In article <3gqv1h$2gu@dartvax.dartmouth.edu>,
  1376. Mark.R.Valence@dartmouth.edu (kurash@dartmouth.edu) wrote:
  1377. > For instance, I'm not convinced that the Component Manager is the right
  1378. > solution (I don't know that much about it, though).  What I do know is
  1379. > that the Component Manager was originally part of QuickTime.  Is it
  1380. > built into all versions of System 7?  When does it load?  Can it be
  1381. > loaded by an INIT if it is not there?  Will we have to license it from
  1382. > Apple in order to get it on System 7.0?  Can it run under System 6
  1383. > (this would be good, because Gestalt is not implemented on all
  1384. > systems)?  What are the real drawbacks, if there are any?
  1385.  
  1386. The Component Manager is installed from System 7.1 forward, or if Sound
  1387. Manager 3.0 is installed, or if QuickTime, or ColorSync, or
  1388. AppleScripting, or similar Apple extensions are installed.
  1389.  
  1390. It should supposedly work with System 6. I don't know if we rev the
  1391. Component manage due to System 6 bugs, though.
  1392.  
  1393. > I agree that the design of this INIT Gestalt gizmo has much in common
  1394. > with the Component Manager, but the code is so ultra-trivial that it
  1395. > would not really be "re-inventing the wheel" to write a few queue
  1396. > access routines.
  1397. > So, convince everyone (who's listening) that the Component Manager is
  1398. > the way to go, and you may just save us from ourselves ;-)
  1399. It's another way to provide shared code/libraries/globals for an
  1400. application. Compare this one with CFM and ASLM, and select the best one
  1401. for your purpose. It will be around for a very long time as QuickTime,
  1402. Sound Manager and other similar extensions need it.
  1403.  
  1404. --Kent
  1405.  
  1406. -- 
  1407. Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  1408. Private activities on Internet.
  1409.  
  1410. +++++++++++++++++++++++++++
  1411.  
  1412. >From sandvik@apple.com (Kent Sandvik)
  1413. Date: Mon, 20 Feb 1995 18:22:58 -0800
  1414. Organization: Apple Computer, Inc. Developer Technical Support
  1415.  
  1416. In article <Jaeger-1102951039350001@slip-2-72.ots.utexas.edu>,
  1417. Jaeger@fquest.com (Brian Stern) wrote:
  1418. > I remember looking at the INIT-CDEV example when I first needed this
  1419. > functionality and thinking that it was too complicated.  I just looked at
  1420. > it again and I understand it better now.  Of course this example goes to
  1421. > all this trouble to make a PPC-Toolbox connection between the INIT and the
  1422. > CDEV and what information does it pass?  A pointer to the INIT's globals. 
  1423. > Oh well.
  1424.  
  1425. The components have a built-in refcon value that could be passed along
  1426. using the SetComponentRefCon and GetComponentRefCon.
  1427.  
  1428. --Kent
  1429.  
  1430. -- 
  1431. Kent Sandvik   sandvik@apple.com   New Media Analyst/Programmer
  1432. Private activities on Internet.
  1433.  
  1434. ---------------------------
  1435.  
  1436. >From John Kawakami <ed_asst@xplain.com>
  1437. Subject: Information on installer maker companies
  1438. Date: Fri, 17 Feb 1995 02:20:36 GMT
  1439. Organization: Xplain Corp.
  1440.  
  1441. Someone forwarded a question to the info group about installers.  The
  1442. reply looked informative enough to post, so here it is:
  1443.  
  1444. > Date: 2/16/95 2:42 AM
  1445. > To: John Kawakami
  1446. > From: Aadjan van der Helm
  1447. > Hello
  1448. > I would like to use the standard Apple installer to install homebrew
  1449. > software. I couldn't find any info on this in the relevant FAQ.
  1450. > Do you know howto customize the behaviour of this installer, or can
  1451. > you point me to people who do?
  1452. > Thanks for reading this
  1453. > --Aadjan (A.vanderHelm@cs.tudelft.nl)
  1454. - -------------------
  1455. From: John Kawakami (2/16/95)
  1456. To: Aadjan van der Helm
  1457.  
  1458. ***
  1459.  
  1460. A simple way to get around creating an installer is to distribute your program
  1461.  as a self extracting archive.  When the user decompresses the archive, she will
  1462.  be asked where she wishes to store the files.
  1463.  
  1464. In May 1994, MacTech did a summary review of several installer utilities.
  1465. Here's are the companies mentioned in that article:
  1466.  
  1467. Apple Installer.  Apple Computer, Inc.  (408) 974-4667.  AppleLink: SW.LICENSE. 
  1468.  Information is also available on E.T.O.
  1469.  
  1470. Developer VISE. MindVision Software. PO Box 81886, Lincoln, Nebraska, 68501.
  1471.  (402) 477-3269 voice, (402) 477-1395 fax. AOL, AppleLink: MindVision;
  1472.  CompuServe: 70253,1437.
  1473.  
  1474. DragInstall. Ray Sauers Associates. 1187 Main Avenue, Suite 1B. Clifton, New
  1475.  Jersey, 07011. (201) 478-1970. AOL: Sauers; CompuServe: 70731,2326; AppleLink:
  1476.  D1922.
  1477.  
  1478. Script-Ease. Glen Canyon Software. 3921 Shasta View. Eugene, OR. 97405. (800)
  1479.  477-6947 or (503) 345-6360. AppleLink: GlenCanyon
  1480.  
  1481. ScriptGen Pro and InstallerPack. StepUp Software. 710 Glendora Avenue, Dallas,
  1482.  Texas  75230-5428.  (214) 360-9301 voice, (214) 360-0127 fax.  AppleLink:
  1483.  StepUp; AOL: StepUp1; CIS: 73607,3630.
  1484.  
  1485. Smaller Installer. Cyclos. PO Box 31417, San Francisco, CA 94131-0417. (415)
  1486.  821-1448. AppleLink: CYCLOS; CompuServe: 71101,204. 
  1487.  
  1488. StuffIt InstallerMaker. Aladdin Systems. 165 Westridge Drive. Watsonville, CA
  1489.  95076. (408) 761-6200 voice, (408) 761-6206 fax. AOL, AppleLink: Aladdin;
  1490.  CompuServe: 75300,1666.
  1491.  
  1492. John Kawakami, ed_asst@xplain.com
  1493. - -comp.sys.mac.programmer.info--------------------------------------
  1494. comp.sys.mac.programmer.info is primarily for distributing FAQs,
  1495. tutorials, news, and similar documents  related to programming the
  1496. Macintosh.  To post, email csmp_info@xplain.com
  1497. - -MacTech Magazine--------------------------------------------------
  1498. PO Box 250055, Los Angeles, CA 90025, 310-575-4343, Fax:310-575-0925
  1499. For more info, ftp://ftp.netcom.com/pub/xp/xplain
  1500.  
  1501. ---------------------------
  1502.  
  1503. >From schulman+@pitt.edu (Christina Schulman)
  1504. Subject: Sound Manager clicking with sampled sounds
  1505. Date: 14 Feb 1995 16:25:50 GMT
  1506. Organization: St. Dismas Infirmary for the Incurably Informed
  1507.  
  1508. As long as we're sharing our woes with the Sound Manager, I've
  1509. been completely unsuccessful in trying to prevent irritating clicking
  1510. at the start of sampled sounds, and I'd be very grateful if
  1511. anyone could suggest a fix.
  1512.  
  1513. I'm using Think C 7.0 on a Quadra 800, 16 Mb RAM, System 7.1.
  1514.  
  1515. I'm reading a succession of sampled sounds, many of them large,
  1516. in from a file in AIFF format.  I can't use SndStartFilePlay()
  1517. because they're embedded in a single file, and as far as I can tell,
  1518. the Sound Manager doesn't provide high-level routines to play
  1519. AIFF's from memory.
  1520.  
  1521. So I'm reading the sound in, finding the start of the sampled sound
  1522. data, backtracking by the size of a SndListResource and SoundHeader,
  1523. writing in my own header information so that it thinks it's a
  1524. format 1 'snd ' resource, and passing this to SndPlay.  Much to my
  1525. surprise, this works.  Unfortunately, it also clicks at the start
  1526. of each sound.
  1527.  
  1528. Inside Mac obligingly informs me that repeated use of bufferCmd
  1529. (which I'm using) is not guaranteed to work on the Mac Plus, SE,
  1530. or Classic without an audible pause or click.  However, I'm using
  1531. a Q800, and this software will never run on a b/w Mac.  I tried
  1532. using soundCmd to install the sampled sound as a voice in my
  1533. sound channel (I'm allocating my own) and playing it with freqCmd,
  1534. but this didn't eliminate the clicking, so I don't think it's
  1535. due to the use of bufferCmd.
  1536.  
  1537. Help!  I'm sure I've seen someone asking about this here before,
  1538. but unfortunately I didn't pay attention at the time.
  1539.  
  1540. Here's the code which writes my sound headers:
  1541.  
  1542. // SndList Resource is the snd format 1 header
  1543.  
  1544. sl = (SndListPtr) (ch);
  1545. sl->format = 0x0001;                      // format 1
  1546. sl->numModifiers = 0x0001;
  1547. sl->modifierPart[0].modNumber = 0x0005;   // sampledSynth
  1548. sl->modifierPart[0].modInit = 0x00000000; // initMono
  1549. sl->numCommands = 1;
  1550. sl->commandPart[0].cmd = 0x8051;          // bufferCmd
  1551. sl->commandPart[0].param1 = 0x0000;       // ignored
  1552. sl->commandPart[0].param2 = 0x00000014;   // offset to sound header
  1553.  
  1554. shd = (SoundHeader *) (sl->dataPart);
  1555. shd->samplePtr = 0x00000000;  // NULL ptr means data follows immediately
  1556. shd->length = numBytes;       // taken from the AIFF common chunk
  1557. shd->sampleRate = rate11khz;
  1558. shd->loopStart = 0x00000000;
  1559. shd->loopEnd = 0x00000000;    // no looping desired
  1560. shd->encode = stdSH;          // standard SoundHeader
  1561. shd->baseFrequency = 0x3C;    // 60 == middle C
  1562.  
  1563.  
  1564. Thanks in advance for any advice.
  1565.  
  1566. -- 
  1567. Christina Schulman                                       schulman+@pitt.edu
  1568.  
  1569. +++++++++++++++++++++++++++
  1570.  
  1571. >From "Andrew C. Plotkin" <ap1i+@andrew.cmu.edu>
  1572. Date: Tue, 14 Feb 1995 15:00:17 -0500
  1573. Organization: Information Technology Center, Carnegie Mellon, Pittsburgh, PA
  1574.  
  1575. Excerpts from netnews.comp.sys.mac.programmer.help: 14-Feb-95 Sound
  1576. Manager clicking with.. Christina Schulman@pitt. (2528)
  1577.  
  1578. > I'm reading a succession of sampled sounds, many of them large,
  1579. > in from a file in AIFF format.  I can't use SndStartFilePlay()
  1580. > because they're embedded in a single file, and as far as I can tell,
  1581. > the Sound Manager doesn't provide high-level routines to play
  1582. > AIFF's from memory.
  1583.  
  1584. > So I'm reading the sound in, finding the start of the sampled sound
  1585. > data, backtracking by the size of a SndListResource and SoundHeader,
  1586. > writing in my own header information so that it thinks it's a
  1587. > format 1 'snd ' resource, and passing this to SndPlay.  Much to my
  1588. > surprise, this works.  Unfortunately, it also clicks at the start
  1589. > of each sound.
  1590.  
  1591. Hurm. Is the data in the "right" format (8-bit unsigned samples, with
  1592. 0x80 as the centerline? I don't know AIFF, but sounds are sometimes
  1593. stored as signed numbers with 0x00 as the center.)
  1594.  
  1595. Does each sound start and end with silence?
  1596.  
  1597. --Z
  1598.  
  1599. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  1600.  
  1601. +++++++++++++++++++++++++++
  1602.  
  1603. >From ldo@waikato.ac.nz (Lawrence D9Oliveiro)
  1604. Date: Wed, 15 Feb 1995 18:08:28 +1300
  1605. Organization: University of Waikato
  1606.  
  1607. In article <3hqlie$cru@usenet.srv.cis.pitt.edu>, schulman+@pitt.edu
  1608. (Christina Schulman) wrote:
  1609.  
  1610. >As long as we're sharing our woes with the Sound Manager, I've
  1611. >been completely unsuccessful in trying to prevent irritating clicking
  1612. >at the start of sampled sounds, and I'd be very grateful if
  1613. >anyone could suggest a fix.
  1614. >
  1615. >I'm using Think C 7.0 on a Quadra 800, 16 Mb RAM, System 7.1.
  1616. >
  1617. ...
  1618. >
  1619. >So I'm reading the sound in, finding the start of the sampled sound
  1620. >data, backtracking by the size of a SndListResource and SoundHeader,
  1621. >writing in my own header information so that it thinks it's a
  1622. >format 1 'snd ' resource, and passing this to SndPlay.  Much to my
  1623. >surprise, this works.  Unfortunately, it also clicks at the start
  1624. >of each sound.
  1625.  
  1626. Don't use SndPlay for this. Instead, open a channel, initialize it for the
  1627. sampled-sound synth, and for each block of sound data, create a
  1628. SoundHeader structure, and feed it to the channel via a bufferCmd command,
  1629. using SndDoCommand.
  1630.  
  1631. Tips:
  1632.  
  1633. 1) To prevent pauses between the bufferfuls, make sure there's always
  1634. another bufferCmd command waiting in the queue before the current one
  1635. finishes. You can put a callBackCmd after every bufferCmd: the callback
  1636. will be delivered when the buffer finishes playing. This will tell you
  1637. when the next one starts, so you can immediately queue yet another
  1638. bufferful to be ready before that one finishes.
  1639. 2) Installing Sound Manager 3.0 is *highly* recommended. Better
  1640. performance, no strange shifts in volume when you open/close channels,
  1641. transparent 8/16-bit conversion, and more. If you install System Update
  1642. 3.0 (which you should have done), you will get the new Sound Manager.
  1643.  
  1644. +++++++++++++++++++++++++++
  1645.  
  1646. >From rbneal@vnet.net (In The Dark Water)
  1647. Date: 16 Feb 1995 03:54:14 GMT
  1648. Organization: Vnet Internet Access, Charlotte, NC -  info@char.vnet.net
  1649.  
  1650. Christina Schulman (schulman+@pitt.edu) wrote:
  1651. : As long as we're sharing our woes with the Sound Manager, I've
  1652. : been completely unsuccessful in trying to prevent irritating clicking
  1653. : at the start of sampled sounds, and I'd be very grateful if
  1654. : anyone could suggest a fix.
  1655.  
  1656. This may not be a fix, but here's a couple points to consider.  The 
  1657. 'click' or 'pop' is usually the Sound Manager turns on the sound 
  1658. hardware.  The clicking noise results often from the current sound to be 
  1659. played being at a level different from the sound just being played.  This 
  1660. can also happen when a sound finishes playing, and the speaker returns to 
  1661. its resting position.
  1662.  
  1663. In his excellent book "Ultimate Mac Programming", Dave Mark spends a 
  1664. whole chapter on the Sound Manager, and includes some interesting source 
  1665. code and sample applications.
  1666.  
  1667. He proposes this workaround for this problem.  Try ending your sounds 
  1668. with a buffer of silence.  Dave says this buffer need only be about 2K of 
  1669. 22KHz data and helps settle out the hardware.  This solved the problem 
  1670. for me in the application I'm writing.  I don't know whether this will 
  1671. help, but I have some sample code, if you'd like.
  1672.  
  1673. Your code looks good; this solution may not be feasible, and I don't know 
  1674. how involved your app is, but if you'd like, send me some email and we'll 
  1675. take another look.
  1676.  
  1677.  
  1678. Thanks,
  1679.  
  1680. Brian Neal
  1681. Starving Mac Programmer
  1682. Charlotte NC
  1683. rbneal@vnet.net
  1684.  
  1685.  
  1686. +++++++++++++++++++++++++++
  1687.  
  1688. >From schulman+@pitt.edu (Christina Schulman)
  1689. Date: 16 Feb 1995 05:54:55 GMT
  1690. Organization: St. Dismas Infirmary for the Incurably Informed
  1691.  
  1692. I complained:
  1693. >>So I'm reading the sound in, finding the start of the sampled sound
  1694. >>data, backtracking by the size of a SndListResource and SoundHeader,
  1695. >>writing in my own header information so that it thinks it's a
  1696. >>format 1 'snd ' resource, and passing this to SndPlay.  Much to my
  1697. >>surprise, this works.  Unfortunately, it also clicks at the start
  1698. >>of each sound.
  1699.  
  1700. Jean-Yves Bernier <bernier@dialup.francenet.fr> replied:
  1701. >Look at your first sound samples: they must be begin at $80 and raise or
  1702. >fall smoothly. $80 is the value converting to 0 volts (in offset-binary).
  1703. >If you use 16-bit samples, this value must be 0 (two's complement).
  1704.  
  1705. This turned out to be the problem; I was so convinced the the click
  1706. was the result of activating the speaker that I hadn't examined the
  1707. sound samples closely enough.
  1708.  
  1709. Each sound does begin and end with silence, but buried several bytes
  1710. into each sample were 8 bytes that were producing the click.  I have
  1711. no idea where these came from; they're certainly not *supposed*
  1712. to be there.
  1713.  
  1714. I ended up kludging it--if the first few bytes at that offset match
  1715. the first few "click bytes," I set the 8 bytes at that offset to
  1716. 0x80.  Presto, no more clicking!
  1717.  
  1718. Thanks for your help, everybody.  This is the last time I trust an
  1719. IBM programmer to give me clean sound samples!
  1720.  
  1721. -- 
  1722. Christina Schulman                                       schulman+@pitt.edu
  1723.  
  1724. ---------------------------
  1725.  
  1726. >From trn@strdev.jhuapl.edu (Tony Nardo)
  1727. Subject: VBL, time manager interrupts on PPC
  1728. Date: 14 Feb 1995 13:15:59 GMT
  1729. Organization: Johns Hopkins University Applied Physics Lab, Columbia, MD, USA
  1730.  
  1731. We are considering migrating some of our C code (developed under MPW) from
  1732. a Quadra to a PowerMac.  One potential problem in this migration is in
  1733. converting in-line assembly statements.  Currently, we use such statements
  1734. in establishing pointers to VBL and time manager control blocks via registers
  1735. A0 and A1, respectively.
  1736.  
  1737. Questions:
  1738.         - does MPW or CodeWarrior support a better mechanism for recovering
  1739.           the VBL or timer control structure from within their respective
  1740.           interrupt?
  1741.         - does either support a clean mechanism for saving registers upon
  1742.           entry into such a routine?  (We found that saving all registers
  1743.           immediately on entry to our VBL/timer interrupts cleared up a
  1744.           few pesky problems.  I'd prefer to retain that capability.)
  1745.         - where can I find documentation on transitioning VBL/timer interrupt
  1746.           support from a 680x0 architecture to the PPC?
  1747.  
  1748. Thanks,
  1749. --
  1750. Tony Nardo,                INET: trn@strdev.jhuapl.edu, trn@aplcomm.jhuapl.edu
  1751.  Johns Hopkins Univ./APL   UUCP: {backbone!}mimsy!aplcomm!trn
  1752.  
  1753. +++++++++++++++++++++++++++
  1754.  
  1755. >From mxmora@unix.sri.com (Matthew Xavier Mora)
  1756. Date: Tue, 14 Feb 1995 09:36:48 -0800
  1757. Organization: SRI International
  1758.  
  1759. In article <3hqaef$pfb@aplcomm.jhuapl.edu>, trn@strdev.jhuapl.edu (Tony
  1760. Nardo) wrote:
  1761.  
  1762. > Questions:
  1763. >         - does MPW or CodeWarrior support a better mechanism for recovering
  1764. >           the VBL or timer control structure from within their respective
  1765. >           interrupt?
  1766. >         - does either support a clean mechanism for saving registers upon
  1767. >           entry into such a routine?  (We found that saving all registers
  1768. >           immediately on entry to our VBL/timer interrupts cleared up a
  1769. >           few pesky problems.  I'd prefer to retain that capability.)
  1770. >         - where can I find documentation on transitioning VBL/timer interrupt
  1771. >           support from a 680x0 architecture to the PPC?
  1772.  
  1773.  
  1774.  
  1775. For performance reasons, you may want to hold off porting your VBLs/timers
  1776. interrupts to powerpc. The VBL and Interrupt mechanism on the PPC
  1777. is emulated. Doing mixed mode manager mode switches 60 times a second
  1778. is not something you want to do. :-)
  1779.  
  1780. These are all good question and I think most of the can be answered in IM 
  1781. Power pc programming (I forget the name of that volume.)
  1782.  
  1783.  
  1784.  
  1785. Xavier
  1786.  
  1787. -- 
  1788. __________________________________________________________________
  1789. Matthew Xavier Mora  (cybernaut)            The keeper of the UMPG
  1790. SRI International                              mxmora@unix.sri.com
  1791.                 
  1792. "Indeed, it would not be an exaggeration to describe the history 
  1793. of the computer industry for the past decade as a massive attempt
  1794. to keep up with Apple." Byte 12/94 
  1795.  
  1796. My home page. <http://xavier.sri.com>
  1797. The WWW UMPG: <http://xavier.sri.com/umpg.html>
  1798. __________________________________________________________________
  1799.  
  1800. +++++++++++++++++++++++++++
  1801.  
  1802. >From trn@strdev.jhuapl.edu (Tony Nardo)
  1803. Date: 15 Feb 1995 18:00:15 GMT
  1804. Organization: Johns Hopkins University Applied Physics Lab, Columbia, MD, USA
  1805.  
  1806. In response to my questions, mxmora@unix.sri.com (Matthew Xavier Mora) writes:
  1807.  
  1808. >For performance reasons, you may want to hold off porting your VBLs/timers
  1809. >interrupts to powerpc. The VBL and Interrupt mechanism on the PPC
  1810. >is emulated. Doing mixed mode manager mode switches 60 times a second
  1811. >is not something you want to do. :-)
  1812.  
  1813. Thanks for the heads-up on that.  Would anyone happen to know where I can find
  1814. a way to evaluate just how much PPC performance is impacted by a mixed mode
  1815. manager switch; i.e. how much time does each switch take?
  1816.  
  1817. >These [below] are all good question and I think most of the can be answered
  1818. >in IM Power pc programming (I forget the name of that volume.)
  1819.  
  1820. Someone else pointed me at E.T.O. (Essentials, Tools, Objects) #15.  I'll
  1821. pass on what I found, and the new questions that arose.
  1822.  
  1823. >> Questions:
  1824. >>         - does MPW or CodeWarrior support a better mechanism for recovering
  1825. >>           the VBL or timer control structure from within their respective
  1826. >>           interrupt?
  1827.  
  1828. This turns out to be somewhat of a non-issue.  Our whole reason for wanting
  1829. to recover the VBL/timer structure was to pick up the A5 register value from
  1830. the parent process, so that we could get at our global data.  SetA5() is no
  1831. longer necessary on the PPC to accomplish this, so the point is now moot for
  1832. our applications.
  1833.  
  1834. ETO also noted that a pointer the control structure for a VBL interrupt is
  1835. passed as a formal parameter into the interrupt service routine.  There was
  1836. no explicit mention of time manager interrupts, but one hopes that the same
  1837. mechanism applies.
  1838.  
  1839. >>         - does either support a clean mechanism for saving registers upon
  1840. >>           entry into such a routine?  (We found that saving all registers
  1841. >>           immediately on entry to our VBL/timer interrupts cleared up a
  1842. >>           few pesky problems.  I'd prefer to retain that capability.)
  1843.  
  1844. This question should perhaps be rephrased: in CodeWarrior and/or MPW's PPCC,
  1845. are *all* registers preserved in each function?
  1846.  
  1847. MPW C for the 680x0 made no attempt to preserve registers D0, D1, A0 and A1
  1848. in a C function.  (This is not very convienient for those who wish to develop
  1849. C interrupt routines! :-) )  A cursory reading of the notes in ETO 15 suggests
  1850. that all PPC registers used by a function are preserved by PPCC within that
  1851. function (assuming local optimization and no inlining), but this is not
  1852. explicitly stated.
  1853.  
  1854. >>         - where can I find documentation on transitioning VBL/timer interrupt
  1855. >>           support from a 680x0 architecture to the PPC?
  1856.  
  1857. ETO 15 provides some details, but no mention was made of VBL/timer interrupts
  1858. being emulated.  Where may I find those notes?
  1859. --
  1860. Tony Nardo,                INET: trn@strdev.jhuapl.edu, trn@aplcomm.jhuapl.edu
  1861.  Johns Hopkins Univ./APL   UUCP: {backbone!}mimsy!aplcomm!trn
  1862.  
  1863. +++++++++++++++++++++++++++
  1864.  
  1865. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1866. Date: Fri, 17 Feb 1995 16:27:17 +1300 (NZDT)
  1867. Organization: (none)
  1868.  
  1869. trn@strdev.jhuapl.edu (Tony Nardo) writes:
  1870. > >>         - does either support a clean mechanism for saving registers upon
  1871. > >>           entry into such a routine?  (We found that saving all registers
  1872. > >>           immediately on entry to our VBL/timer interrupts cleared up a
  1873. > >>           few pesky problems.  I'd prefer to retain that capability.)
  1874. > This question should perhaps be rephrased: in CodeWarrior and/or MPW's PPCC,
  1875. > are *all* registers preserved in each function?
  1876. > MPW C for the 680x0 made no attempt to preserve registers D0, D1, A0 and A1
  1877. > in a C function.  (This is not very convienient for those who wish to develop
  1878. > C interrupt routines! :-) )  A cursory reading of the notes in ETO 15 suggests
  1879. > that all PPC registers used by a function are preserved by PPCC within that
  1880. > function (assuming local optimization and no inlining), but this is not
  1881. > explicitly stated.
  1882.  
  1883. The answer is "no".  General PPC functions can and do clobber registers r0 and
  1884. r3-r12.
  1885.  
  1886. I would expect that Apple's PPC interrupt handler will be saving and
  1887. restoring everything for you so you don't have to worry about it.
  1888.  
  1889. -- Bruce
  1890.  
  1891. ---------------------------
  1892.  
  1893. >From jjohnson@crl.com (Jeffrey Johnson)
  1894. Subject: anything *bad* about mixing alignment types in CW?
  1895. Date: 16 Feb 1995 11:42:28 -0800
  1896. Organization: CRL Dialup Internet Access        (415) 705-6060  [Login: guest]
  1897.  
  1898. I'm building an app with the AppsToGo framework, and I'm at the point of 
  1899. trying to get it to run a wee bit faster. After reading the docs on the 
  1900. CW5 disk, I decided to try setting my project to PowerPC struct alignment 
  1901. from 68K alignment to get things to move in memory faster.  
  1902.  
  1903. Boy, that was fun :-). The Gworld layers code terminated me immediately 
  1904. on a GetGWorldPixMap, but then hummed along like nothing was wrong after 
  1905. resetting to 68K alignment.
  1906.  
  1907. in another area, I tried using Tim Olson's bzero(void*,int) instead of 
  1908. memset(x,0,size) to clear the float array foo[x][y] with bzero(foo,x*y*4).
  1909. This resulted in an access fault almost immediately (*of course* it could
  1910. be something my code is stomping on, but the memset seems to work).. I'm 
  1911. guessing that could this be from my float array not being aligned on a 
  1912. quadword boundary?
  1913.  
  1914. So now I seem to have good reasons for aligning my project either 
  1915. way...Help!
  1916.  
  1917. Thanks
  1918. Jeff
  1919.  
  1920.  
  1921. -- 
  1922. Jeffrey Johnson                                               jjohnson@crl.com
  1923. If you believe what you read, the sky is thick with aliens who are designing
  1924. pyramids, disemboweling livestock, impregnating rural people and generally
  1925. having a good time at our expense.  -Scott Adams
  1926.  
  1927. +++++++++++++++++++++++++++
  1928.  
  1929. >From jwbaxter@olympus.net (John W. Baxter)
  1930. Date: Sat, 18 Feb 1995 22:39:21 -0800
  1931. Organization: Internet for the Olympic Peninsula
  1932.  
  1933. In article <3i09r4$ndm@crl12.crl.com>, jjohnson@crl.com (Jeffrey Johnson) wrote:
  1934.  
  1935. > I'm building an app with the AppsToGo framework, and I'm at the point of 
  1936. > trying to get it to run a wee bit faster. After reading the docs on the 
  1937. > CW5 disk, I decided to try setting my project to PowerPC struct alignment 
  1938. > from 68K alignment to get things to move in memory faster.  
  1939. > Boy, that was fun :-). The Gworld layers code terminated me immediately 
  1940. > on a GetGWorldPixMap, but then hummed along like nothing was wrong after 
  1941. > resetting to 68K alignment.
  1942. > in another area, I tried using Tim Olson's bzero(void*,int) instead of 
  1943. > memset(x,0,size) to clear the float array foo[x][y] with bzero(foo,x*y*4).
  1944. > This resulted in an access fault almost immediately (*of course* it could
  1945. > be something my code is stomping on, but the memset seems to work).. I'm 
  1946. > guessing that could this be from my float array not being aligned on a 
  1947. > quadword boundary?
  1948. > So now I seem to have good reasons for aligning my project either 
  1949. > way...Help!
  1950.  
  1951. Any struct the toolbox thinks it knows about had better be aligned the way
  1952. the toolbox thinks it is:  68K.
  1953.  
  1954. Any struct the toolbox doesn't know about needs only be consistently
  1955. aligned everywhere in your code.  And if you write it into files, that
  1956. still holds:  both your 68K version and your PPC version should treat it
  1957. the same in the file (whichever way it is).  Or destructurize it for
  1958. filing purposes.
  1959.  
  1960. Of course, we all use Bento for filing now, don't we?  --John
  1961.  
  1962. -- 
  1963. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  1964.        Isn't C fun?
  1965.    jwbaxter@pt.olympus.net
  1966.  
  1967. ---------------------------
  1968.  
  1969. >From knuth@lmis.loral.com (David Knuth)
  1970. Subject: custom ClikLoop problem
  1971. Date: Fri, 17 Feb 1995 17:40:29 GMT
  1972. Organization: Loral Medical Imaging Systems
  1973.  
  1974. I am having trouble with my custom click loop for a list.  I'm trying
  1975. to have the list update dynamically as the list is scrolled (i.e.,
  1976. manually draw grey grid lines around all the cells--the data is updated
  1977. automatically by LClick), however call-back routine is only called when
  1978. a mouse-down occurs in the rView rect (the area where the cells are). 
  1979. No mouse-down event is reported when the mouse-down is in the scroll
  1980. bar.  How can I remedy this?
  1981.  
  1982. Thanks
  1983.  
  1984. David Knuth
  1985. knuth@lmis.loral.com
  1986.  
  1987. +++++++++++++++++++++++++++
  1988.  
  1989. >From kurisuto@babel.ling.upenn.edu (Sean Crist)
  1990. Date: 17 Feb 1995 21:51:57 GMT
  1991. Organization: University of Pennsylvania, Linguistics Department
  1992.  
  1993. In article <1995Feb17.174029.20070@lmis.loral.com>,
  1994. David Knuth <knuth@lmis.loral.com> wrote:
  1995. >I am having trouble with my custom click loop for a list.  I'm trying
  1996. >to have the list update dynamically as the list is scrolled (i.e.,
  1997. >manually draw grey grid lines around all the cells--the data is updated
  1998. >automatically by LClick), however call-back routine is only called when
  1999. >a mouse-down occurs in the rView rect (the area where the cells are). 
  2000. >No mouse-down event is reported when the mouse-down is in the scroll
  2001. >bar.  How can I remedy this?
  2002.  
  2003. Assuming you're using a custom LDEF, why don't you just draw the grid lines
  2004. as part of your cell?  The List Manager doesn't clip the drawing your LDEF
  2005. does to particular cells; you can scribble all over the window if you like.
  2006.  
  2007. If you're not using a custom LDEF, I'd recommend that you do so; they're
  2008. easy to write, as long as you do the business of jumping from an LDEF stub
  2009. into your main code (I assume you know what I'm talking about; ask me if
  2010. you need to know how to do this).
  2011.  
  2012.   \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
  2013.  ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  2014.   _| ,| ,|   -----       this account.
  2015.   _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
  2016.    |  |  |    [_]        common?   A:  Nothing... yet.
  2017.  
  2018. +++++++++++++++++++++++++++
  2019.  
  2020. >From sears@netcom.com (Daniel Sears)
  2021. Date: Sun, 19 Feb 1995 06:19:22 GMT
  2022. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2023.  
  2024. knuth@lmis.loral.com (David Knuth) writes:
  2025.  
  2026. >I am having trouble with my custom click loop for a list.  I'm trying
  2027. >to have the list update dynamically as the list is scrolled (i.e.,
  2028. >manually draw grey grid lines around all the cells--the data is updated
  2029. >automatically by LClick), however call-back routine is only called when
  2030. >a mouse-down occurs in the rView rect (the area where the cells are). 
  2031. >No mouse-down event is reported when the mouse-down is in the scroll
  2032. >bar.  How can I remedy this?
  2033.  
  2034. >Thanks
  2035.  
  2036. >David Knuth
  2037. >knuth@lmis.loral.com
  2038.  
  2039. Try this:
  2040.  
  2041. /*
  2042.  * Adapted from Michael Hecht's code.
  2043.  * This works around a bug in the PowerMacintosh ROM
  2044.  * click_loop_glue is a quick & dirty way of doing
  2045.  * inline 68K assembly from PowerPC code.
  2046.  * We need to do this because if we have the List Manager
  2047.  * call our native click loop directly,
  2048.  * it can fail because the List Manager doesn't actually
  2049.  * test the result in D0, it just checks the state of the Z-bit,
  2050.  * which Mixed Mode doesn't set for us.
  2051.  *
  2052.  * Example:
  2053.  *
  2054.  *              pascal Boolean  ClickLoopProc(void);
  2055.  *
  2056.  *              #ifdef  powerc
  2057.  *                      if (PPC_LClick(event->where, event->modifiers, list, ClickLoopProc)) {
  2058.  *                      }
  2059.  *              #else
  2060.  *                      (*list)->lClikLoop = ClickLoopProc;
  2061.  *                      if (LClick(event->where, event->modifiers, list)) {
  2062.  *                      }
  2063.  *              #endif
  2064.  */
  2065. Boolean
  2066. PPC_LClick(
  2067.         Point where,
  2068.         short modifiers,
  2069.         ListHandle list,
  2070.         pascal Boolean (*click_loop)(void))
  2071. {
  2072.         ListClickLoopUPP cl_upp;
  2073.         long result;
  2074.         static struct {
  2075.                 unsigned short          cl_glue[6];
  2076.                 ListClickLoopUPP        cl_upp;                 // Storage for the UPP
  2077.         } click_loop_glue = {
  2078.                 {
  2079.                         0x207A, 0x000A,                                 // MOVEA.L      click_loop_glue.cl_upp,A0
  2080.                         0x4E90,                                                 // JSR          (A0)
  2081.                         0x4A00,                                                 // TST.B        D0
  2082.                         0x4E75,                                                 // RTS
  2083.                         0x4E71                                                  // NOP          -- pad to longword
  2084.                 },
  2085.                 0                                                                       // cl_upp
  2086.         };
  2087.  
  2088.         cl_upp = NewListClickLoopProc(click_loop);
  2089.         click_loop_glue.cl_upp = cl_upp;
  2090.         cl_upp = (ListClickLoopUPP) &click_loop_glue;
  2091.  
  2092.         (*list)->lClickLoop = cl_upp;                   // Set up clikLoop routine
  2093.  
  2094.         result = LClick(where, modifiers, list);
  2095.  
  2096.         (*list)->lClickLoop = 0;                                // Remove clikLoop routine
  2097.  
  2098.         /*
  2099.          * Put the real UPP back in the local so that we can dispose of it
  2100.          */
  2101.         cl_upp = click_loop_glue.cl_upp;
  2102.         DisposeRoutineDescriptor((UniversalProcPtr) cl_upp);
  2103.         return (Boolean) result;
  2104. }
  2105. -- 
  2106. E-mail:     sears@netcom.com
  2107. Phone:      415.695.0650
  2108. Address:    2440 16th Street #283
  2109.             San Francisco, CA
  2110.             94103-4211
  2111.  
  2112. This email message sent with 100% recycled bits.
  2113.  
  2114. ---------------------------
  2115.  
  2116. End of C.S.M.P. Digest
  2117. **********************
  2118.